﻿using System.Data;
using System.Data.SqlClient;

namespace DAL
{
    public class DBHelper
    {
        //一、连接字符串  现需要连接的服务器和数据库，以什么身份登录服务器  静态服务器（不会经常修改）server=服务器所在地
        public static string connStr = "Server=Lyy\\MSSQLSERVER2022;Database=db_NetShop;Trusted_Connection=True;Encrypt=True;TrustServerCertificate=True;";         //Windows身份验证
        //public static string connStr1 = "server=.;database=XXDB;uid=sa;pwd=123456;";//SQL server 超级管理员身份验证

        //二、声明所需对象
        public static SqlConnection conn = null;        //连接对象
        public static SqlCommand cmd = null;            //命令对象
        public static DataTable dt = null;              //DataTable 对象

        //取到对象后需要保存对象
        public static SqlDataAdapter sda = null;       //SqlDataAdapter 对象
        //需要读取对象
        public static SqlDataReader dr = null;         //SqlDataReader对象


        //定义一个方法初始化连接
        public static void InitConnection()
        {
            //判断连接对象是否为空，是则创建
            if (conn == null)
                //将要连接的字符串传给SqlConnection
                conn = new SqlConnection(connStr);
            //判断连接是否关闭，是则打开   ConnectionState枚举类型
            if (conn.State == ConnectionState.Closed)
                conn.Open();
            //判断连接是否中断，是则重启
            if (conn.State == ConnectionState.Broken)
            {
                conn.Close();       //关闭连接
                conn.Open();        //打开连接

            }


        }


        //封装 执行增、删、改，返回bool类型是否成功  Execute 执行 Non 非 Query 查询 将SQL语句传给方法
        public static bool ExecuteNonQuery(string sql)
        {
            //打开连接
            InitConnection();
            //创建命令对象
            cmd = new SqlCommand(sql, conn);
            //执行命令
            int result = cmd.ExecuteNonQuery();     //获取结果
            //关闭连接
            conn.Close();
            //返回结果
            return result > 0;

        }

        //非断开式：似电话，需要一直连接上（无法保证数据一直提供，容易造成系统崩溃）；断开式：不需要两个终端同时在线（无法保证数据的准确性）

        //执行查询，返回SqlDataReader 对象--【非断开式{直接从数据库中读取}】
        public static SqlDataReader GetDataReader(string sql)
        {
            //打开连接
            InitConnection();
            //创建命令对象
            cmd = new SqlCommand(sql, conn);        //将SQL语句和命令对象传过来
            //执行命令 返回SqlDataReader对象，并自动关闭连接对象  CommandBehavior枚举类型 调用CloseConnection关闭连接
            //SqlDataReader dr = cmd.ExecuteReader();
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }

        //执行查询，返回DataTable对象--【断开式】
        public static DataTable GetDataTable(string sql)
        {
            //打开连接
            InitConnection();
            //创建DataTable对象         中转站
            dt = new DataTable();
            //创建SqlDataAdapter对象       得到结果
            sda = new SqlDataAdapter(sql, conn);
            //填充数据
            sda.Fill(dt);
            //关闭连接
            conn.Close();
            //返回DataTable对象
            return dt;
        }


        //查询，执行聚合函数，返回首行首列单个数据 使用所有数据的父类型数据object数据类型
        public static object ExecuteScalar(string sql)
        {
            //打开链接
            InitConnection();
            //创建命令对象
            cmd = new SqlCommand(sql, conn);
            //执行命令，获取结果
            //返回什么类型的数据就声明一个什么类型的变量值
            object result = cmd.ExecuteScalar();
            //关闭连接
            conn.Close();
            return result;
        }



    }
}
